/**
 * @file config.h
 * @brief 应用程序配置管理类 - 集中管理所有配置参数
 *
 * Config类提供应用程序的所有配置参数，包括：
 * - API服务器地址和网络配置
 * - 应用程序基本信息
 * - UI界面配置和主题设置
 * - 布局尺寸和间距配置
 * - 颜色主题定义
 *
 * 特点：
 * - 静态方法设计，无需实例化
 * - 编译时配置，支持调试/发布环境切换
 * - 集中管理，便于维护和修改
 * - 类型安全，使用Qt数据类型
 */

#ifndef CONFIG_H
#define CONFIG_H

#include <QString>      // Qt字符串类型
#include <QSize>        // Qt尺寸类型
#include <QJsonObject>  // Qt JSON对象类型

/**
 * @class Config
 * @brief 应用程序配置管理类
 *
 * 提供应用程序运行所需的所有配置参数。
 * 使用静态方法设计，确保配置的一致性和易用性。
 * 支持编译时环境切换（调试/发布模式）。
 */
class Config {
public:
    // === API服务器配置 ===
    /**
     * @brief 获取API服务器基础URL
     * @return API服务器的基础URL字符串
     *
     * 根据编译模式返回不同的服务器地址：
     * - 调试模式：本地开发服务器 (http://localhost:8008)
     * - 发布模式：生产环境服务器 (https://api.yourdomain.com)
     *
     * 示例用法：
     * QString baseUrl = Config::getApiBaseUrl();
     * // 调试模式返回："http://localhost:8008"
     * // 发布模式返回："https://api.yourdomain.com"
     */
    static QString getApiBaseUrl() {
#ifdef QT_DEBUG
        return "http://localhost:8080";         // 开发环境：本地服务器
#else
        return "https://api.yourdomain.com";    // 生产环境：正式服务器
#endif
    }

    /**
     * @brief 获取认证服务器URL
     * @return 认证服务器的URL字符串
     *
     * 专门用于用户认证相关的API调用。
     * 在微服务架构中，认证服务可能部署在独立的服务器上。
     *
     * 示例用法：
     * QString authUrl = Config::getAuthServiceUrl();
     * // 用于构建登录、注册、令牌刷新等API端点
     */
    static QString getAuthServiceUrl() {
#ifdef QT_DEBUG
        return "http://localhost:8008";         // 开发环境：与API服务器相同
#else
        return "https://auth.yourdomain.com";   // 生产环境：独立的认证服务器
#endif
    }

    // === 应用程序基本信息 ===
    /**
     * @brief 获取应用程序名称
     * @return 应用程序的显示名称
     *
     * 用于：
     * - 窗口标题显示
     * - 关于对话框
     * - 系统托盘提示
     * - HTTP User-Agent头
     *
     * 示例：窗口标题显示为"游戏客户端 - 登录"
     */
    static QString getAppName() {
        return "游戏客户端";
    }

    /**
     * @brief 获取应用程序版本号
     * @return 版本号字符串（语义化版本格式）
     *
     * 版本号格式：主版本.次版本.修订版本
     * - 主版本：重大功能变更或不兼容更新
     * - 次版本：新功能添加，向后兼容
     * - 修订版本：错误修复和小改进
     *
     * 用于：
     * - 关于对话框显示
     * - HTTP User-Agent头
     * - 更新检查
     * - 日志记录
     */
    static QString getAppVersion() {
        return "1.0.0";
    }

    // === Snake游戏配置 ===
    /**
     * @brief 获取Snake游戏名称
     * @return Snake游戏名称字符串
     */
    static QString getSnakeGameName() {
        return "Snake Game";
    }

    /**
     * @brief 获取Snake游戏默认地区
     * @return 默认地区字符串
     */
    static QString getSnakeGameDefaultRegion() {
        return "Auto";
    }

    /**
     * @brief 获取Snake游戏默认房间配置
     * @return 默认房间配置JSON对象
     */
    static QJsonObject getSnakeGameDefaultRoomConfig() {
        QJsonObject config;
        config["max_players"] = 4;
        config["game_mode"] = 1;
        config["map_width"] = 40;
        config["map_height"] = 30;
        config["game_speed_ms"] = 100;
        config["enable_walls"] = true;
        config["enable_special_foods"] = false;
        config["max_food_count"] = 10;
        return config;
    }

    // === 网络通信配置 ===
    /**
     * @brief 获取网络请求超时时间
     * @return 超时时间（毫秒）
     *
     * 网络请求的最大等待时间，超过此时间将取消请求。
     *
     * 设置考虑：
     * - 30秒适合大多数API调用
     * - 文件上传可能需要更长时间
     * - 移动网络环境需要更长超时
     *
     * 示例：
     * QTimer::singleShot(Config::getRequestTimeout(), reply, [reply]() {
     *     if (reply->isRunning()) reply->abort();
     * });
     */
    static int getRequestTimeout() {
        return 30000; // 30秒 = 30,000毫秒
    }

    /**
     * @brief 获取网络请求最大重试次数
     * @return 最大重试次数
     *
     * 当网络请求失败时的自动重试次数。
     *
     * 重试场景：
     * - 网络连接临时中断
     * - 服务器临时不可用
     * - 超时错误
     *
     * 不重试场景：
     * - 4xx客户端错误（如401认证失败）
     * - 数据格式错误
     *
     * 示例：总共会尝试4次（1次原始请求 + 3次重试）
     */
    static int getMaxRetries() {
        return 3;
    }

    // === 用户界面配置 ===
    /**
     * @brief 获取默认主题名称
     * @return 默认主题标识符
     *
     * 应用程序启动时使用的默认主题。
     *
     * 可选主题：
     * - "dark"：深色主题，适合长时间使用，减少眼部疲劳
     * - "light"：浅色主题，明亮清晰，适合白天使用
     *
     * 示例：applyTheme(Config::getDefaultTheme());
     */
    static QString getDefaultTheme() {
        return "dark";              // 默认使用深色主题
    }

    /**
     * @brief 获取默认窗口大小
     * @return 默认窗口尺寸（宽度x高度）
     *
     * 应用程序首次启动或重置时使用的窗口大小。
     *
     * 尺寸选择考虑：
     * - 1200x800适合大多数现代显示器（1920x1080及以上）
     * - 3:2宽高比，平衡内容显示和屏幕利用率
     * - 为侧边栏（220px）和主内容区（980px）提供充足空间
     *
     * 示例：resize(Config::getDefaultWindowSize());
     */
    static QSize getDefaultWindowSize() {
        return QSize(1200, 800);    // 宽1200像素，高800像素
    }

    /**
     * @brief 获取最小窗口大小
     * @return 窗口的最小尺寸限制
     *
     * 防止窗口缩小到无法正常使用的尺寸。
     *
     * 限制考虑：
     * - 确保侧边栏（最小60px）完全可见
     * - 主内容区有足够空间显示游戏服务器列表
     * - 按钮和控件不会重叠或被截断
     * - 保持界面的可用性和美观性
     *
     * 示例：setMinimumSize(Config::getMinimumWindowSize());
     */
    static QSize getMinimumWindowSize() {
        return QSize(900, 600);     // 最小宽900像素，高600像素
    }

    /**
     * @brief 获取登录窗口大小
     * @return 登录页面的窗口尺寸
     *
     * 专门为登录、注册、忘记密码等认证页面设计的窗口尺寸。
     *
     * 设计理念：
     * - 比默认窗口稍小，但仍保持良好的视觉效果
     * - 为登录表单提供充足的显示空间
     * - 支持未来可能的功能扩展（如验证码、多因素认证）
     *
     * 示例：登录成功后会自动调整为默认窗口大小
     */
    static QSize getLoginWindowSize() {
        return QSize(1000, 700);    // 登录窗口尺寸，比默认窗口稍小
    }

    // === 布局尺寸和比例配置 ===
    /**
     * @brief 获取侧边栏展开时的宽度
     * @return 侧边栏展开状态的像素宽度
     *
     * 侧边栏完全展开时的宽度，需要容纳：
     * - 用户头像（60px）和信息文本
     * - 导航按钮的图标和文字
     * - 适当的内边距和间距
     *
     * 示例：220px = 60px(头像) + 140px(文字区域) + 20px(边距)
     */
    static int getSidebarExpandedWidth() { return 220; } // 展开宽度：220像素

    /**
     * @brief 获取侧边栏收缩时的宽度
     * @return 侧边栏收缩状态的像素宽度
     *
     * 侧边栏收缩时的最小宽度，只显示图标：
     * - 图标尺寸（通常24px或32px）
     * - 最小可点击区域（44px以上，符合人机交互标准）
     * - 适当的内边距
     *
     * 示例：60px = 32px(图标) + 28px(边距和点击区域)
     */
    static int getSidebarCollapsedWidth() { return 65; } // 收缩宽度：60像素

    /**
     * @brief 获取主内容区域占比
     * @return 主内容区域在整个窗口中的比例（0.0-1.0）
     *
     * 主内容区域与侧边栏的比例分配。
     * 0.75表示主内容区域占75%的宽度。
     */
    static double getMainContentRatio() { return 0.75; }

    /**
     * @brief 获取侧边栏占比
     * @return 侧边栏在整个窗口中的比例（0.0-1.0）
     *
     * 与主内容区域比例互补，两者之和应为1.0。
     * 0.25表示侧边栏占25%的宽度。
     */
    static double getSidebarRatio() { return 0.25; }

    /**
     * @brief 获取服务器列表占比
     * @return 服务器列表在主内容区域中的比例
     *
     * 在游戏服务器页面中，服务器列表与服务器详情的比例分配。
     * 0.65表示服务器列表占主内容区域65%的宽度。
     */
    static double getServerListRatio() { return 0.65; }

    /**
     * @brief 获取服务器详情占比
     * @return 服务器详情在主内容区域中的比例
     *
     * 与服务器列表比例互补。
     * 0.35表示服务器详情占主内容区域35%的宽度。
     */
    static double getServerDetailsRatio() { return 0.35; }

    // === 间距和边距配置 ===
    /**
     * @brief 获取标准间距
     * @return 标准间距像素值
     *
     * 用于大多数UI元素之间的间距，如：
     * - 按钮之间的间距
     * - 表单字段之间的间距
     * - 卡片组件之间的间距
     *
     * 示例：layout->setSpacing(Config::getStandardSpacing());
     */
    static int getStandardSpacing() { return 20; }

    /**
     * @brief 获取紧凑间距
     * @return 紧凑间距像素值
     *
     * 用于需要节省空间的场景，如：
     * - 工具栏按钮间距
     * - 列表项内部间距
     * - 状态栏元素间距
     *
     * 示例：toolbar->setSpacing(Config::getCompactSpacing());
     */
    static int getCompactSpacing() { return 12; }

    /**
     * @brief 获取大间距
     * @return 大间距像素值
     *
     * 用于需要明显分隔的场景，如：
     * - 页面区块之间的间距
     * - 对话框中不同部分的间距
     * - 重要元素的强调间距
     *
     * 示例：用于分隔不同功能区域
     */
    static int getLargeSpacing() { return 30; }

    /**
     * @brief 获取标准边距
     * @return 标准边距像素值
     *
     * 用于容器的内边距，如：
     * - 窗口内容的边距
     * - 面板的内边距
     * - 卡片的内边距
     *
     * 示例：layout->setContentsMargins(Config::getStandardMargin(), ...);
     */
    static int getStandardMargin() { return 25; }

    /**
     * @brief 获取紧凑边距
     * @return 紧凑边距像素值
     *
     * 用于空间受限的容器，如：
     * - 工具栏的边距
     * - 小对话框的边距
     * - 嵌套容器的边距
     *
     * 示例：用于节省空间的布局
     */
    static int getCompactMargin() { return 15; }

    // === 颜色主题配置 ===
    /**
     * @brief 获取主色调
     * @return 主色调的十六进制颜色值
     *
     * 应用程序的主要品牌色，用于：
     * - 主要按钮背景色
     * - 链接文字颜色
     * - 进度条颜色
     * - 选中状态高亮
     *
     * 颜色：#4A90E2 (蓝色系，专业、可信赖的感觉)
     * RGB: (74, 144, 226)
     */
    static QString getPrimaryColor() { return "#4A90E2"; }

    /**
     * @brief 获取辅助色
     * @return 辅助色的十六进制颜色值
     *
     * 用于强调和点缀，如：
     * - 成功状态指示
     * - 特殊标记
     * - 装饰元素
     *
     * 颜色：#7ED321 (绿色系，积极、成功的感觉)
     * RGB: (126, 211, 33)
     */
    static QString getSecondaryColor() { return "#7ED321"; }

    /**
     * @brief 获取背景色
     * @return 主背景色的十六进制颜色值
     *
     * 深色主题的主要背景色，用于：
     * - 窗口主背景
     * - 面板背景
     * - 容器背景
     *
     * 颜色：#2C3E50 (深蓝灰色，护眼且专业)
     * RGB: (44, 62, 80)
     */
    static QString getBackgroundColor() { return "#2C3E50"; }

    /**
     * @brief 获取文字色
     * @return 主要文字颜色的十六进制颜色值
     *
     * 深色主题下的主要文字颜色，用于：
     * - 标题文字
     * - 正文内容
     * - 标签文字
     *
     * 颜色：#ECF0F1 (浅灰白色，与深色背景形成良好对比)
     * RGB: (236, 240, 241)
     */
    static QString getTextColor() { return "#ECF0F1"; }

    /**
     * @brief 获取错误色
     * @return 错误状态的十六进制颜色值
     *
     * 用于错误提示和警告，如：
     * - 错误消息文字
     * - 验证失败提示
     * - 危险操作按钮
     *
     * 颜色：#E74C3C (红色系，警告和危险的通用色)
     * RGB: (231, 76, 60)
     */
    static QString getErrorColor() { return "#E74C3C"; }

    /**
     * @brief 获取成功色
     * @return 成功状态的十六进制颜色值
     *
     * 用于成功提示和确认，如：
     * - 成功消息文字
     * - 完成状态指示
     * - 确认操作按钮
     *
     * 颜色：#27AE60 (绿色系，成功和完成的通用色)
     * RGB: (39, 174, 96)
     */
    static QString getSuccessColor() { return "#27AE60"; }

    /**
     * @brief 获取警告色
     * @return 警告状态的十六进制颜色值
     *
     * 用于警告提示和注意事项，如：
     * - 警告消息文字
     * - 需要注意的状态
     * - 中性提醒按钮
     *
     * 颜色：#F39C12 (橙色系，警告和注意的通用色)
     * RGB: (243, 156, 18)
     */
    static QString getWarningColor() { return "#F39C12"; }

    /**
     * @brief 获取悬停色
     * @return 鼠标悬停时的十六进制颜色值
     *
     * 用于交互元素的悬停状态，如：
     * - 按钮悬停背景
     * - 列表项悬停高亮
     * - 链接悬停效果
     *
     * 颜色：#34495E (中性灰蓝色，比背景色稍亮)
     * RGB: (52, 73, 94)
     */
    static QString getHoverColor() { return "#34495E"; }
};

#endif // CONFIG_H
